package com.thinkgsp.jxc.report;

import java.io.File;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.*;
import org.junit.Test;

import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

import com.thinkgsp.jxc.model.BillAmount;
import com.thinkgsp.jxc.model.BillDetail;
import com.thinkgsp.jxc.model.Customer;
import com.thinkgsp.jxc.model.Dept;
import com.thinkgsp.jxc.model.Emp;
import com.thinkgsp.jxc.model.InventoryAdd;
import com.thinkgsp.jxc.model.Product;
import com.thinkgsp.jxc.model.ProductBatchNo;
import com.thinkgsp.jxc.model.SalesStockOutBill;
import com.thinkgsp.report.JRBillDataSource;

public class JxcBeanFactory {

	public static JRBillDataSource createDataSource() {
		SalesStockOutBill bill = new SalesStockOutBill();
		bill.setBillCode("XA000000001");
		bill.setBillDate(new Date(System.currentTimeMillis()));
		Dept dept = new Dept();
		dept.setDeptName("销售部");
		bill.setDept(dept);
		Emp emp = new Emp();
		emp.setEmpCode("0001");
		emp.setEmpName("张某文");
		bill.setEmp(emp);
		bill.setMaker(emp);
		
		
		Customer customer = new Customer();
		customer.setCustomerCode("X0001");
		customer.setCustomerName("汕头市天健药业有限公司");
		bill.setCustomer(customer);
		
		BillAmount ba = new BillAmount();
		ba.setBillAmount(new BigDecimal("2060"));
		bill.setBillAmount(ba);
		
		ProductBatchNo batchNo = new ProductBatchNo();
		batchNo.setBatchNo("20130101");
		batchNo.setExpDate(new Date(System.currentTimeMillis()));
		batchNo.setManufDate(new Date(System.currentTimeMillis()));
		
		InventoryAdd invAdd = new InventoryAdd();
		invAdd.setInventoryAddName("商场");
		
		Product product = new Product();
		product.setProductBusName("拜阿司匹林");
		product.setProductName("阿司匹林肠溶片");
		product.setProductCode("101001");
		product.setLicenseNo("国药准字201200001");
		product.setManuf("拜耳制药");
		product.setPackSpec("30s");
		product.setUnit("盒");
		
		BillDetail d1 = bill.createDetail();
		d1.setProduct(product);
		d1.setBatchNo(batchNo);
		d1.setInvAdd(invAdd);
		d1.setQuantity(new BigDecimal("10"));
		d1.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d1);
		
		BillDetail d2 = bill.createDetail();
		d2.setProduct(product);
		d2.setBatchNo(batchNo);
		d2.setInvAdd(invAdd);
		d2.setQuantity(new BigDecimal("10"));
		d2.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d2);
		
		BillDetail d3 = bill.createDetail();
		d3.setProduct(product);
		d3.setBatchNo(batchNo);
		d3.setInvAdd(invAdd);
		d3.setQuantity(new BigDecimal("10"));
		d3.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d3);
		
		BillDetail d4 = bill.createDetail();
		d4.setProduct(product);
		d4.setBatchNo(batchNo);
		d4.setInvAdd(invAdd);
		d4.setQuantity(new BigDecimal("10"));
		d4.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d4);
		
		BillDetail d5 = bill.createDetail();
		d5.setProduct(product);
		d5.setBatchNo(batchNo);
		d5.setInvAdd(invAdd);
		d5.setQuantity(new BigDecimal("10"));
		d5.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d5);
		
		BillDetail d6 = bill.createDetail();
		d6.setProduct(product);
		d6.setBatchNo(batchNo);
		d6.setInvAdd(invAdd);
		d6.setQuantity(new BigDecimal("10"));
		d6.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d6);
		
		BillDetail d7 = bill.createDetail();
		d7.setProduct(product);
		d7.setBatchNo(batchNo);
		d7.setInvAdd(invAdd);
		d7.setQuantity(new BigDecimal("10"));
		d7.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d7);
		
		BillDetail d8 = bill.createDetail();
		d8.setProduct(product);
		d8.setBatchNo(batchNo);
		d8.setInvAdd(invAdd);
		d8.setQuantity(new BigDecimal("10"));
		d8.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d8);
		
		BillDetail d9 = bill.createDetail();
		d9.setProduct(product);
		d9.setBatchNo(batchNo);
		d9.setInvAdd(invAdd);
		d9.setQuantity(new BigDecimal("10"));
		d9.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d9);
		
		BillDetail d10 = bill.createDetail();
		d10.setProduct(product);
		d10.setBatchNo(batchNo);
		d10.setInvAdd(invAdd);
		d10.setQuantity(new BigDecimal("10"));
		d10.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d10);
		
		BillDetail d11 = bill.createDetail();
		d11.setProduct(product);
		d11.setBatchNo(batchNo);
		d11.setInvAdd(invAdd);
		d11.setQuantity(new BigDecimal("10"));
		d11.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d11);
		
		BillDetail d12 = bill.createDetail();
		d12.setProduct(product);
		d12.setBatchNo(batchNo);
		d12.setInvAdd(invAdd);
		d12.setQuantity(new BigDecimal("10"));
		d12.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d12);
		
		BillDetail d13 = bill.createDetail();
		d13.setProduct(product);
		d13.setBatchNo(batchNo);
		d13.setInvAdd(invAdd);
		d13.setQuantity(new BigDecimal("10"));
		d13.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d13);
		
		BillDetail d14 = bill.createDetail();
		d14.setProduct(product);
		d14.setBatchNo(batchNo);
		d14.setInvAdd(invAdd);
		d14.setQuantity(new BigDecimal("10"));
		d14.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d14);
		
		BillDetail d15 = bill.createDetail();
		d15.setProduct(product);
		d15.setBatchNo(batchNo);
		d15.setInvAdd(invAdd);
		d15.setQuantity(new BigDecimal("10"));
		d15.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d15);
		
		BillDetail d16 = bill.createDetail();
		d16.setProduct(product);
		d16.setBatchNo(batchNo);
		d16.setInvAdd(invAdd);
		d16.setQuantity(new BigDecimal("10"));
		d16.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d16);
		
		BillDetail d17 = bill.createDetail();
		d17.setProduct(product);
		d17.setBatchNo(batchNo);
		d17.setInvAdd(invAdd);
		d17.setQuantity(new BigDecimal("10"));
		d17.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d17);
		
		BillDetail d18 = bill.createDetail();
		d18.setProduct(product);
		d18.setBatchNo(batchNo);
		d18.setInvAdd(invAdd);
		d18.setQuantity(new BigDecimal("10"));
		d18.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d18);
		
		BillDetail d19 = bill.createDetail();
		d19.setProduct(product);
		d19.setBatchNo(batchNo);
		d19.setInvAdd(invAdd);
		d19.setQuantity(new BigDecimal("10"));
		d19.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d19);
		
		BillDetail d20 = bill.createDetail();
		d20.setProduct(product);
		d20.setBatchNo(batchNo);
		d20.setInvAdd(invAdd);
		d20.setQuantity(new BigDecimal("10"));
		d20.setPrice(new BigDecimal("10.3"));
		bill.getDetails().add(d20);
		
		
		JRBillDataSource datasource = new JRBillDataSource(bill);
		return datasource;
	}
//	public static void main(String[] args) {
//		System.out.println("test");
//		try {
//			//List<SalesStockOutBill> bills = generateSalesStockOutBill();
//			JRBillDataSource ds = createDataSource();
//			System.out.println(ds);
//		} catch(Exception e) {
//			e.printStackTrace();
//		}
//	}
	
	@Test
	public void testCreateReportToPDF() {
		try {
			File file = new File("H:\\MyProgrames\\ThinkGSP\\Docs\\JasperReport\\jsxml\\SalesStockOutBill.jasper");
				JasperReport jasperReport = (JasperReport)JRLoader.loadObject(file);
			Map<String,Object> params = new HashMap<String, Object>();
			JRBillDataSource ds = JxcBeanFactory.createDataSource();
			params.put("title", "汕头市天健药业有限公司");
			JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds);
			JRPdfExporter exporter = new JRPdfExporter();
			exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
			exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "c:\\test.pdf");
			exporter.exportReport();
			assertTrue(true);
		} catch(Exception e) {
			e.printStackTrace();
			fail(e.getMessage());
		}
	}
	
	@Test
	public void testHelloWorld() {
		assertTrue(true);
	}
}
